// src/utils/event-bus.js
import Vue from 'vue';

// 创建全局事件总线实例
export const EventBus = new Vue();

/**
 * 触发事件
 * @param {string} eventName - 事件名称
 * @param {...any} args - 传递的参数
 */
export const emitEvent = (eventName, ...args) => {
    EventBus.$emit(eventName, ...args);
};

/**
 * 监听事件
 * @param {string} eventName - 事件名称
 * @param {Function} callback - 回调函数
 */
export const listenEvent = (eventName, callback) => {
    EventBus.$on(eventName, callback);
};

/**
 * 移除事件监听
 * @param {string} eventName - 事件名称
 * @param {Function} [callback] - 可选的回调函数（不传则移除所有该事件的监听）
 */
export const removeEvent = (eventName, callback) => {
    if (callback) {
        EventBus.$off(eventName, callback);
    } else {
        EventBus.$off(eventName);
    }
};

/**
 * 自动绑定事件监听，并在组件销毁时自动移除
 * @param {Vue} vm - Vue 组件实例
 * @param {Object} events - 事件监听配置（格式：{ 'eventName': callback }）
 */
export const autoBindEvents = (vm, events) => {
    // 存储所有绑定的事件监听器，确保精准移除
    const listeners = {};

    // 绑定事件监听
    Object.keys(events).forEach(eventName => {
        const callback = (...args) => events[eventName].apply(vm, args);
        EventBus.$on(eventName, callback);
        listeners[eventName] = callback; // 保留回调引用
    });

    // 在组件销毁时自动移除事件监听
    const originalBeforeDestroy = vm.$options.beforeDestroy || [];
    vm.$options.beforeDestroy = [() => {
        Object.keys(listeners).forEach(eventName => {
            EventBus.$off(eventName, listeners[eventName]);
        });
        // 执行原有 beforeDestroy 钩子（兼容数组形式）
        originalBeforeDestroy.forEach(hook => hook.call(vm));
    }];
};


/**
 * 使用示例：A 组件
 * import { emitEvent, autoBindEvents } from '@/utils/event-bus';
 * emitEvent('message', { text: 'Hello from ChildA' });
 *
 * B 组件
 *  created() {
 *     // 自动绑定事件监听，并在销毁时移除
 *     autoBindEvents(this, {
 *       message: this.handleMessage
 *     });
 *   },
 *   methods: {
 *     handleMessage(payload) {
 *       this.message = payload.text;
 *     }
 *   }
 */
